#include "thread.h"
#include <unistd.h>
#include <cstdlib>

using namespace std;

namespace red {
namespace hilos {
namespace thread {

Thread::~Thread() {
}

//Crea un nuevo hilo y lo pone en marcha.
void Thread::start() {
	::pthread_create(&this->m_Thread, NULL, &rutinaEstatica, this);
}

//Suspende la ejecuci�n de otro hilo hasta que este termine.
void Thread::join() {
	::pthread_join(this->m_Thread, NULL);
}

//Pone a dormir este hilo dusrante usecs milisegundos.
void Thread::sleep(unsigned int usecs) {
	::usleep(usecs);
}

//Esta rutina es necesaria para poner en marcha el hilo.
//Se encarga de ejecutar el m�todo run.
void *Thread::rutinaEstatica(void *p_pArg) {
	
	Thread *t_pThread;

	t_pThread = static_cast<Thread *>(p_pArg);
	t_pThread->run();

	return NULL;
}

void Thread::cancel() {
	::pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
	::pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
	::pthread_cancel(this->m_Thread);
}

}
}
}
